/**
 * 
 */
package gwtool.backend.updater;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

/**
 * @author Christian Diese Klasse enthült mehere Methoden um ganze
 *         Ordnerstrukturen zu verschieben.
 */
public class KopierWerkzeug {

	/**
	 * 
	 * @param defaultPfad
	 *            Pfad
	 * @param pfad
	 *            Pfad
	 * @return Erfolgreich?
	 */
	public boolean copySavedData(String defaultPfad, String pfad) {

		return copySavedData(defaultPfad, pfad, true);
	}

	/**
	 * Kopiert Ordner und datein sichert aber eventuell vorhanden Dateien
	 * 
	 * @param defaultPfad
	 *            Quelle
	 * @param pfad
	 *            Ziel
	 * @param sichern
	 *            Sichern?
	 * @return Erfolgreich?
	 */
	public boolean copySavedData(String defaultPfad, String pfad, boolean sichern) {

		File quelle = new File(defaultPfad);
		File ziel = new File(pfad);
		if (quelle.exists()) {
			if (ziel.exists() && sichern) {
				ordnerSichern(ziel);
			}
			try {
				if (quelle.isFile()) {
					copyFile(quelle, ziel);
				} else {
					copyDir(quelle, ziel);
				}
				return true;
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
		} else {
			return true;
		}
		return false;
	}

	/**
	 * 
	 * @param quelle
	 *            Quellepfad
	 * @param ziel
	 *            Zielpfad
	 * @throws IOException
	 *             ex
	 */
	public void copyDir(File quelle, File ziel) throws IOException {

		File[] files = quelle.listFiles();
		ziel.mkdirs();
		if (files != null) {
			for (File file : files) {
				if (file.isDirectory()) {
					copyDir(file, new File(ziel.getAbsolutePath() + System.getProperty("file.separator") + file.getName()));
				} else {
					copyFile(file, new File(ziel.getAbsolutePath() + System.getProperty("file.separator") + file.getName()));
				}
			}
		}
	}

	/**
	 * 
	 * @param file
	 *            Quellepfad
	 * @param ziel
	 *            Zielpfad
	 * @throws IOException
	 *             ex
	 */
	public void copyFile(File file, File ziel) throws IOException {

		BufferedInputStream in = new BufferedInputStream(new FileInputStream(file));
		BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(ziel, true));
		int bytes = 0;
		while ((bytes = in.read()) != -1) {
			out.write(bytes);
		}
		in.close();
		out.close();
	}

	/**
	 * Der angegebene Pfad wird gesichert, indem .old angehängt wird.
	 * 
	 * @param ziel
	 *            Pfad der gesichert werden soll
	 */
	public void ordnerSichern(File ziel) {

		String zielPfad = ziel.getAbsolutePath();
		while (new File(zielPfad).exists()) {
			zielPfad += ".old";
		}
		ziel.renameTo(new File(zielPfad));
	}

	/**
	 * @param f
	 *            Filesize
	 * @return Filesize im Fehlerfall -1
	 */
	public int getFileSize(File f) {

		try {
			BufferedInputStream in = new BufferedInputStream(new FileInputStream(f));
			int bytes = 0;
			int fileSize = 0;
			while ((bytes = in.read()) != -1) {
				fileSize += bytes;
			}
			in.close();
			return fileSize;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return -1;
	}

	/**
	 * 
	 * @param f
	 *            File
	 * 
	 * @return gibt true zurück wenn man in diesem Ordner schreiben kann.
	 */
	public static boolean hatOrdnerSchreibrechte(File f) {

		if (f.isFile() || f.getName().endsWith("zip.hld")) {
			f = f.getParentFile();
		}
		File newFile;
		int i = 0;
		do {
			newFile = new File(f.getAbsolutePath() + "/schreibtest" + i);
			i++;
		} while (newFile.exists());
		try {
			BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(newFile, true));
			out.write('A');
			String sepas = System.getProperty("line.separator");
			for (int y = 0; y < sepas.length(); y++) {
				out.write(sepas.charAt(y));
			}
			out.flush();
			out.close();
			Scanner scanner = new Scanner(newFile);
			boolean ok = false;
			String s = scanner.next();
			if (s.equals("A")) {
				ok = true;
			}
			scanner.close();
			newFile.delete();
			return ok;
		} catch (Exception e) {
			// e.printStackTrace(); //keine Schreibrechte
			return false;
		}
	}
}
